package qc.module.qms.api.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.enums.qms.QmsPointTimeSegmentEnum;
import qc.common.core.exception.QCPromptException;
import qc.common.core.utils.LocalDateTimeUtil;
import qc.module.platform.dto.uac.UacUserInfoDto;
import qc.module.qms.api.RestTemplatePlatform;
import qc.module.qms.dto.task.*;
import qc.module.qms.service.QmsManualTaskService;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * QmsTaskManualController
 *
 * @author QuCheng Tech
 * @since 2025/10/14
 */
@RestController
@RequestMapping("/task")
public class QmsManualTaskController {

    @Autowired
    private QmsManualTaskService service;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;

    /**
     * 根据request请求头中的token和项目编码信息获取当前登录用户信息
     *
     * @return qc.module.platform.dto.uac.UacUserInfoDto
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    private UacUserInfoDto getUserInfo() {
        //获取用户名称
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        try {
            UacUserInfoDto userInfoDto = restTemplatePlatform.getUserInfo(headers);

            if (userInfoDto != null)
                return userInfoDto;
        } catch (QCPromptException e) {

        }

        return null;
    }

    /**
     * 新增处理原始数据任务
     *
     * @param dto 处理原始数据任务对象
     * @return qc.module.qms.dto.task.ManualTaskOperateResultDto
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    @RequestMapping(value = "/raw", method = {RequestMethod.GET, RequestMethod.POST})
    public ManualTaskOperateResultDto addProcessRawDataTask(@RequestBody ManualTaskProcessRawDataAddDto dto) {
        //初始化返回结果，先设置是否成功为false
        ManualTaskOperateResultDto result = new ManualTaskOperateResultDto();
        result.setSuccess(false);

        //return service.addProcessRawDataTask(dto);
        return result;
    }

    /**
     * 新增计算点号数据任务
     *
     * @param dto 计算点号数据任务对象
     * @return qc.module.qms.dto.task.ManualTaskOperateResultDto
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    @RequestMapping(value = "/calc", method = {RequestMethod.GET, RequestMethod.POST})
    public ManualTaskOperateResultDto addCalcPointDataTask(@RequestBody ManualTaskCalcPointDataAddDto dto) {
        //初始化返回结果，先设置是否成功为false
        ManualTaskOperateResultDto result = new ManualTaskOperateResultDto();
        result.setSuccess(false);
        if (dto == null) {
            result.setMsg("新增计算点号数据任务对象不能为空");
            return result;
        }
        if (StringUtils.isBlank(dto.getTitle())) {
            result.setMsg("新增计算点号数据任务标题不能为空");
            return result;
        }
        if (StringUtils.isBlank(dto.getContent())) {
            result.setMsg("新增计算点号数据任务内容和描述信息不能为空");
            return result;
        }
        if (dto.getPointids() == null || dto.getPointids().length < 0x1) {
            result.setMsg("新增计算点号数据任务中的点号集合不能为空");
            return result;
        }
        //获取输入的点号集合，判断是否有空字符串
        List<String> pointIds = new ArrayList<>();
        for (String pointid : dto.getPointids()) {
            if (StringUtils.isNotBlank(pointid)) {
                if (pointIds.contains(pointid) == false)
                    pointIds.add(pointid);
            }
        }
        if (pointIds.size() < 0x1) {
            result.setMsg("新增计算点号数据任务中的有效点号数量为0");
            return result;
        }

        QmsPointTimeSegmentEnum tmseg = QmsPointTimeSegmentEnum.getQmsPointTimeSegmentEnum(dto.getTmseg());
        if (tmseg == null || tmseg == QmsPointTimeSegmentEnum.UN_DEFINE) {
            result.setMsg("新增计算点号数据任务中的点号时段类型错误");
            return result;
        }
        //判断和转换起止时间
        LocalDateTime beginTime = null;
        LocalDateTime endTime = null;
        if (StringUtils.isBlank(dto.getBegintm())) {
            result.setMsg("新增计算点号数据任务中的起始时间不能为空");
            return result;
        } else {
            beginTime = LocalDateTimeUtil.parse(dto.getBegintm());
        }
        if (StringUtils.isBlank(dto.getEndtm())) {
            result.setMsg("新增计算点号数据任务中的截止时间不能为空");
            return result;
        } else {
            endTime = LocalDateTimeUtil.parse(dto.getEndtm());
        }
        if (beginTime == null) {
            result.setMsg("新增计算点号数据任务中的起始时间错误，不是有效的时间格式");
            return result;
        }
        if (endTime == null) {
            result.setMsg("新增计算点号数据任务中的截止时间错误，不是有效的时间格式");
            return result;
        }
        if (beginTime.isAfter(endTime)) {
            result.setMsg("新增计算点号数据任务中的起始时间不能大于截止时间");
            return result;
        }

        //获取用户ID和名称
        int userid = 0x0;
        String username = null;
        UacUserInfoDto userInfo = getUserInfo();
        if (userInfo != null) {
            if (userInfo.getId() != null)
                userid = userInfo.getId().intValue();
            username = userInfo.getName();
        }

        return service.addCalcPointDataTask(dto.getTitle(), dto.getContent(), pointIds, tmseg, beginTime, endTime, userid, username);
    }

    /**
     * 新增转发点号数据任务
     *
     * @param dto 转发点号数据任务对象
     * @return qc.module.qms.dto.task.ManualTaskOperateResultDto
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    @RequestMapping(value = "/forward", method = {RequestMethod.GET, RequestMethod.POST})
    public ManualTaskOperateResultDto addForwardPointDataTask(@RequestBody ManualTaskForwardPointDataAddDto dto) {
        //初始化返回结果，先设置是否成功为false
        ManualTaskOperateResultDto result = new ManualTaskOperateResultDto();
        result.setSuccess(false);

        //return service.addForwardPointDataTask(dto);
        return result;
    }

    /**
     * 新增导出数据文件任务
     *
     * @param dto 出数据文件任务对象
     * @return qc.module.qms.dto.task.ManualTaskOperateResultDto
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    @RequestMapping(value = "/export", method = {RequestMethod.GET, RequestMethod.POST})
    public ManualTaskOperateResultDto addGenerateExportFileTask(@RequestBody ManualTaskGenerateExportFileAddDto dto) {
        //初始化返回结果，先设置是否成功为false
        ManualTaskOperateResultDto result = new ManualTaskOperateResultDto();
        result.setSuccess(false);

        //return service.addGenerateExportFileTask(dto);
        return result;
    }

    /**
     * 新增生成归档文件任务
     *
     * @param dto 生成归档文件任务对象
     * @return qc.module.qms.dto.task.ManualTaskOperateResultDto
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    @RequestMapping(value = "/archive", method = {RequestMethod.GET, RequestMethod.POST})
    public ManualTaskOperateResultDto addGenerateArchiveReportTask(@RequestBody ManualTaskGenerateArchiveReportAddDto dto) {
        //初始化返回结果，先设置是否成功为false
        ManualTaskOperateResultDto result = new ManualTaskOperateResultDto();
        result.setSuccess(false);

        //return service.addGenerateArchiveReportTask(dto);
        return result;
    }
}
